ποΈGitΠ―ΡΠ°ποΈ
specs/005-tak-v2-protocol/plan.md bd2863243bab6eb213401d949839a2bc74dde7e2 (bd286324) Text, 10.30 KB
Implementation Plan: TAK v2 Protocol Integration
Branch: T383838tak_v2 | Date: 2026-05-13 | Spec: T383838specs/005-tak-v2-protocol/spec.md
Input: Feature specification from T383838/specs/005-tak-v2-protocol/spec.md
Status: Retroactive β documents existing implementation (PR #5434, 99 files, +4698 lines)
Summary
Upgrades Meshtastic Android's TAK integration from legacy v1 (port 72, PLI + GeoChat only) to TAK v2 (port 78, ATAKPLUGINV2) with zstd dictionary compression and full CoT type coverage. The implementation uses a bidirectional bridge pattern (T383838TAKMeshIntegration) that version-gates output based on firmware capability (T383838Capabilities.supportsTakV2 β₯ 2.8.0) while always accepting inbound traffic on both ports. Compression is provided by the T383838meshtastic/TAKPacket-SDK (JitPack) with platform abstraction via expect/actual for iOS stubs.
Technical Context
Language/Version: Kotlin 2.3+ targeting JDK 21 (KMP multi-target)
Primary Dependencies: TAKPacket-SDK v0.1.3 (zstd compression), xmlutil (CoT XML parsing), Ktor Network (TCP), zstd-jni 1.5.7-7, Okio (I/O), Koin 4.2+ (DI), Kermit (logging)
Storage: App-private filesystem for route KML data packages; bundled .p12/.pem certificates for TLS
Testing: T383838commonTest (9 test classes, 65+ test methods), 40 XML fixture files in T383838jvmAndroidMain/resources/tak_test_fixtures/
Target Platform: Android (primary), JVM Desktop (secondary), iOS (stubs only)
Project Type: Mobile app β KMP module (T383838core:takserver) + UI integration (T383838feature:settings)
Performance Goals: CoT processing < 100ms; compressed PLI < 100 bytes; fits within ~225-byte usable LoRa payload
Constraints: 237-byte raw LoRa MTU (~225 usable after protobuf framing); PARTIALWAKELOCK for CPU keepalive; mTLS on port 8089
Scale/Scope: 28 CoT type mappings, 2 protocol versions, 3 platform targets, 1 new KMP module + UI screen
Constitution Check
GATE: β
All six principles evaluated and satisfied.
β’ I. Kotlin Multiplatform Core: β
All business logic (TAKMeshIntegration, conversions, type mapper, CoT parser, detail stripper, server manager, models, DI module) resides in T383838commonMain. Platform-specific code isolated to:
β’ T383838jvmAndroidMain: TAKServerJvm (JSSE TLS), TakV2Compressor (zstd-jni via SDK), TakCertLoader, TAKClientConnection
β’ T383838androidMain: AtakFileWriter (SAF/private dirs), TakPermissionUtil (runtime permissions)
β’ T383838jvmMain: AtakFileWriter (desktop filesystem), TakPermissionUtil (no-op)
β’ T383838iosMain: TAKServerIos (no-op), TakV2Compressor (uncompressed stub), AtakFileWriter (stub)
β’ II. Zero Lint Tolerance: β
Verification commands:
T282828
./gradlew spotlessApply spotlessCheck detekt :core:takserver:allTests :feature:settings:allTests
β’ III. Compose Multiplatform UI: β
T383838TAKConfigItemList.kt uses Compose Multiplatform components (T383838DropDownPreference, T383838SwitchPreference, T383838TitledCard). No direct Android Jetpack Compose imports. Float values use T383838NumberFormatter.format() where displayed.
β’ IV. Privacy First: β
No PII/location/crypto keys logged. CoT data stays local to device/mesh. T383838core/proto submodule not modified (read-only upstream). Certificates bundled as resources, not logged.
β’ V. Design Standards Compliance: β
TAK config UI uses M3 components (SwitchPreference, DropDownPreference). Cross-Platform Spec: TAKPacket-SDK defines shared wire protocol behavior; Android-specific UI is N/A for cross-platform spec (ATAK integration is Android/JVM-only; iOS uses stubs).
β’ VI. Verify Before Push: β
Local verification:
T282828
./gradlew spotlessApply spotlessCheck detekt assembleDebug :core:takserver:allTests :feature:settings:allTests
gh pr checks T79c0ff5434
Project Structure
Documentation (this feature)
T282828
specs/005-tak-v2-protocol/
βββ plan.md # This file
βββ research.md # Phase 0: Technology decisions and rationale
βββ data-model.md # Phase 1: Entity models and state machines
βββ quickstart.md # Phase 1: Developer onboarding guide
βββ contracts/ # Phase 1: Wire protocol contracts
β βββ wire-protocol.md
βββ tasks.md # Phase 2 output (/speckit.tasks command)
Source Code (repository root)
T282828
core/takserver/
βββ build.gradle.kts # Module config + TAKPacket-SDK dependency
βββ src/
βββ commonMain/kotlin/org/meshtastic/core/takserver/
β βββ di/CoreTakServerModule.kt # Koin DI wiring
β βββ TAKMeshIntegration.kt # Bidirectional bridge (main orchestrator)
β βββ TAKServer.kt # Platform interface (expect)
β βββ TAKServerManager.kt # Lifecycle + offline queue
β βββ TAKPacketV2Conversion.kt # CoT β TAKPacketV2 (v2 protocol)
β βββ TAKPacketConversion.kt # CoT β TAKPacket (v1 legacy)
β βββ TakV2Compressor.kt # Zstd compression (expect)
β βββ TakV2TypeMapper.kt # CoT type string β enum (28 mappings)
β βββ CoTDetailStripper.kt # Strip 16 bloat elements for MTU
β βββ CoTXmlParser.kt # Streaming XML β CoTMessage
β βββ CoTXmlDataClasses.kt # Serializable CoT data model
β βββ CoTXmlFrameBuffer.kt # TCP stream framing
β βββ CoTXml.kt # CoTMessage β XML serialization
β βββ CoTConversion.kt # Shared conversion helpers
β βββ TakConversionHelpers.kt # Coordinate scaling utilities
β βββ RouteDataPackageGenerator.kt # Route β KML data package
β βββ TAKDataPackageGenerator.kt # Connection .zip export
β βββ TAKModels.kt # Domain models
β βββ TAKDefaults.kt # Constants and defaults
β βββ TAKPrefXmlDataClasses.kt # ATAK preference XML schema
β βββ TakFixtureLoader.kt # Test fixture loading (expect)
β βββ TakMeshTestRunner.kt # In-app diagnostic runner
β βββ AtakFileWriter.kt # Filesystem abstraction (expect)
β βββ XmlUtils.kt # XML escaping (5 special chars)
β βββ ZipArchiver.kt # ZIP creation (expect)
βββ commonTest/kotlin/.../
β βββ CoTConversionTest.kt
β βββ CoTDetailStripperTest.kt
β βββ CoTXmlFrameBufferTest.kt
β βββ CoTXmlParserTest.kt
β βββ CoTXmlTest.kt
β βββ TAKDefaultsTest.kt
β βββ TAKPacketConversionTest.kt
β βββ TAKPacketV2RawDetailTest.kt
β βββ XmlUtilsTest.kt
βββ jvmAndroidMain/kotlin/.../
β βββ TAKServerJvm.kt # JSSE mTLS implementation
β βββ TAKClientConnection.kt # Per-client state machine
β βββ TakCertLoader.kt # Certificate loading
β βββ TakV2Compressor.kt # Zstd actual (via TAKPacket-SDK)
β βββ TakFixtureLoader.kt # JVM resource loading
β βββ ZipArchiver.kt # java.util.zip actual
βββ jvmAndroidMain/resources/
β βββ tak_certs/ # Bundled mTLS certificates
β βββ tak_test_fixtures/ # 40 CoT XML fixtures
βββ androidMain/kotlin/.../
β βββ AtakFileWriter.kt # SAF/private directory writer
βββ jvmMain/kotlin/.../
β βββ AtakFileWriter.kt # Desktop filesystem writer
βββ iosMain/kotlin/.../
βββ TAKServerIos.kt # No-op server
βββ TakV2Compressor.kt # Uncompressed stub (flags=0xFF)
βββ AtakFileWriter.kt # No-op
βββ TakFixtureLoader.kt # No-op
βββ ZipArchiver.kt # No-op
feature/settings/src/
βββ commonMain/kotlin/.../radio/component/
β βββ TAKConfigItemList.kt # Compose UI (team, role, server toggle)
βββ commonMain/kotlin/.../tak/
β βββ TakPermissionUtil.kt # Permission interface (expect)
βββ androidMain/kotlin/.../tak/
β βββ TakPermissionUtil.kt # ACCESS_LOCAL_NETWORK (API 37+)
βββ jvmMain/kotlin/.../tak/
β βββ TakPermissionUtil.kt # No-op
βββ iosMain/kotlin/.../tak/
βββ TakPermissionUtil.kt # No-op
core/model/src/commonMain/kotlin/.../
βββ Capabilities.kt # supportsTakV2 (>= 2.8.0)
core/service/src/androidMain/kotlin/.../
βββ MeshService.kt # PARTIAL_WAKE_LOCK for TAK server
Structure Decision: KMP multi-module architecture. New T383838core:takserver module contains all TAK business logic in T383838commonMain with platform actuals for TLS, compression, and filesystem. UI lives in the existing T383838feature:settings module. Wake lock integration in existing T383838core:service.
Complexity Tracking
βββββββββββββββββββββββββββββββββββββββ¬ββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Violation β Whβ¦ β Simpler Alternative Rejected Because β
βββββββββββββββββββββββββββββββββββββββΌββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β T383838jvmAndroidMain shared source set β TAβ¦ β Separate T383838androidMain/T383838jvmMain actuals would duplicatβ¦ β
β Regex-based XML stripping (not DOM) β T383838Coβ¦ β Full DOM parsing adds allocation overhead and requiβ¦ β
β Branch name T383838tak_v2 (no prefix) β Prβ¦ β N/A β not a new branch β
βββββββββββββββββββββββββββββββββββββββ΄ββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Served by rngit 1.5.0 - Generated in 0.05s